<?php
/**
 * 文件上传扩展类
 * ver 1.0
 * author Myxf
 */
 class UploadFile {

 	public $ver = "1.0";
 	public $max_size = '10485760';//设置上传文件大小
 	public $file_name = 'date';//重命名方式代表以时间命名，其他则使用给予的名称
 	public $allow_types;//允许上传的文件扩展名，不同文件类型用“|”隔开
 	public $errmsg = '';//错误信息
 	public $uploaded = '';//上传后的文件名(包括文件路径)
 	public $save_path;//上传文件保存路径
 	private $files;//提交的等待上传文件
 	private $file_type = array();//文件类型
 	private $ext = '';//上传文件扩展名

 	/**
 	 * 构造函数，初始化类
 	 * @access public
 	 * @param string $save_path 上传的目标文件夹
 	 * @param string $allow_types 运行上传的文件类型
 	 * @param string $file_name 是否按日期重命名
 	 */
 	public function __construct($save_path = '/upload/',$allow_types = 'jpg|gif|png|zip|rar',$file_name = 'date') {
		$this->file_name   = $file_name;//重命名方式代表以时间命名，其他则使用给予的名称
		$this->save_path   = (preg_match('/\/$/',$save_path)) ? $save_path : $save_path . '/';
		$this->allow_types = $allow_types;
 	}

 	/**
 	 * 上传文件
 	 * @access public
 	 * @param $files 等待上传的文件(表单传来的$_FILES[])
 	 * @param $type 允许上传的文件扩展名，不同文件类型用“|”隔开
 	 * @param $uploadpath 文件保存目录默认是upload
 	 * @return boolean 返回布尔值
 	 */
	public function upload_file($files) {
		$name = $files['name'];
		$type = $files['type'];
		$size = $files['size'];
		$tmp_name = $files['tmp_name'];
		$error = $files['error'];

		switch ($error) {
			case 0 : $this->errmsg = '';
				break;
			case 1 : $this->errmsg = '超过了php.ini中文件大小';
				break;
			case 2 : $this->errmsg = '超过了MAX_FILE_SIZE 选项指定的文件大小';
				break;
	 	    case 3 : $this->errmsg = '文件只有部分被上传';
				break;
			case 4 : $this->errmsg = '没有文件被上传';
				break;
			case 5 : $this->errmsg = '上传文件大小为0';
				break;
		    default : $this->errmsg = '上传文件失败！';
				break;
			}
		if($error == 0 && is_uploaded_file($tmp_name)) {
			//检测文件类型
			if($this->check_file_type($name,$this->allow_types) == FALSE){
				$this->errmsg = '不支持的文件类型';
				return $this->errmsg;
			}
			//检测文件大小
			if($size > $this->max_size){
				$this->errmsg = '上传文件太大，最大支持'.ceil($this->max_size/1024).'kb的文件';
				return $this->errmsg;
			}
			$this->set_save_path();//设置文件存放路径
			$new_name = $this->file_name != 'date' ? $this->file_name.'.'.$this->ext : date('YmdHis').rand(111111,999999).'.'.$this->ext;//设置新文件名
			$this->uploaded = $this->save_path.$new_name;//上传后的文件名
			//移动文件
			if(move_uploaded_file($tmp_name,$_SERVER['DOCUMENT_ROOT'].$this->uploaded)){
				return $this->uploaded;
			}else{
				return $this->errmsg;
			}

		}else{
			return $this->errmsg;
		}
	}

 	/**
 	 * 检查上传文件类型
 	 * @access public
 	 * @param string $filename 等待检查的文件名
 	 * @return 如果检查通过返回TRUE 未通过则返回FALSE和错误消息
 	 */
    public function check_file_type($filename,$types){
		$ext = $this->get_file_type($filename);
		$this->ext = $ext;
		if (empty($types)){
           $allow_types = explode('|',$this->allow_types);//分割允许上传的文件扩展名为数组
		}else{
           $allow_types = explode('|',$types);//分割允许上传的文件扩展名为数组
		}
  		//echo $ext;
  		//检查上传文件扩展名是否在请允许上传的文件扩展名中
  		if(in_array($ext,$allow_types)){
  			return TRUE;
  		}else{
  			$this->errmsg = '上传文件<font color=red>'.$filename.'</font>类型错误，只支持上传<font color=red>'.str_replace('|',',',$this->allow_types).'</font>等文件类型!';
  			return FALSE;
  		}
    }

    /**
     * 取得文件类型
     * @access public
     * @param string $filename 要取得文件类型的目标文件名
     * @return string 文件类型
     */
    public function get_file_type($filename){
    	$info = pathinfo($filename);
    	$ext = $info['extension'];
    	return strtolower($ext);
    }

	/**
	 * 设置文件上传后的保存路径
	 */
	public function set_save_path(){
		$this->save_path = (preg_match('/\/$/',$this->save_path)) ? $this->save_path : $this->save_path . '/';
		if(!is_dir($this->save_path)){
			//如果目录不存在，创建目录
			$this->set_dir();
		}
	}


	/**
	 * 创建目录
	 * @access public
	 * @param string $dir 要创建目录的路径
	 * @return boolean 失败时返回错误消息和FALSE
	 */
	public function set_dir($dir = null){
		//检查路径是否存在
		if(!$dir){
			$dir = $this->save_path;
		}
		if(is_dir($dir)){
			$this->errmsg = '需要创建的文件夹已经存在！';
		}
		$dir = explode('/', $dir);
		$d = "";
		foreach($dir as $v){
			if($v){
				$d .= $v . '/';
				if(!is_dir($d)){
					$state = @mkdir($d, 0777);
					if(!$state)
						$this->errmsg = '在创建目录' . $d . '时出错！';
				}
			}
		}
		return true;
	}
 }
?>